function ArrayDecoder(non_array) {
	
	this.non_array = non_array;

	this.decode = function(t, b) {		
		if(t.isArray()) {

			if(b == Types.NULL_TOKEN) return null;		

			var depth = 0;
			var sub = t.subtype();
			var onemore = false;
			
			var buf = "";
			var arr = new Array();
			var index = 0;

			for(var i = 1; i < b.length - 1; i++) {
				var c = b.charAt(i);

				if(c == Types.ARRAY_START)	depth++;
				if(c == Types.ARRAY_END) 	depth--;

				if(depth == 0 && c == Types.ARRAY_SPLITTER) {
					if(buf.length > 0) {
						arr[index] = this.decode(sub, buf);
						index++;
					}

					buf = "";
					onemore = false;
				}
				else {
					onemore = true;
					buf += c;
				}
			}
			if(onemore) {
				if(buf.length > 0) {
					arr[index] = this.decode(sub, buf);
					index++;
				}
			}

			return arr;
		}		

		return this.non_array.decode(t, b);
	}

	this.isDecodeable = function(t) {
		return (t.isArray() && this.isDecodeable(t.subtype())) || this.non_array.isDecodeable(t);
	}

}